const { ListToNode, NodeToList, ListNode, timeL } = require("../utils.js");
/**
 * @param {number[]} candidates
 * @param {number} target
 * @return {number[][]}
 */
var combinationSum = function (candidates, target) {
  let res = [];
  const fun = (candidates, target, arr = []) => {
    for (let i = 0; i < candidates.length; i++) {
      if (target === candidates[i]) {
        res.push([...arr, candidates[i]]);
      } else if (candidates[i] < target) {
        fun(candidates, target - candidates[i], [...arr, candidates[i]]);
      }
    }
  };
  fun(candidates, target);
  return [
    ...new Set(
      res.map((item) => {
        return item.sort((a, b) => a - b).join("-");
      })
    ),
  ].map((item) =>
    item.split("-").map((item) => {
      return +item;
    })
  );
  // let obj = {};
  // for (let i = 0; i < candidates.length; i++) {
  //   obj[candidates[i]] = 0;
  // }

  // const creatMap = (list) => {
  //   let map = { ...obj },
  //     res = {};
  //   for (let i = 0; i < list.length; i++) {
  //     map[list[i]] += 1;
  //   }
  //   for (let i in map) {
  //     res[`${i}-${map[i]}`] = true;
  //   }
  //   return res;
  // };
  // let map = {};
  // for (let i = 0; i < res.length; i++) {
  //   let newMap = creatMap(res[i]),
  //     bool = true;
  //   for (let y in newMap) {
  //     if (!map[y]) {
  //       map = { ...map, ...newMap };
  //       bool = false;
  //       break;
  //     }
  //   }
  //   if (bool) {
  //     res.splice(i, 1);
  //     i -= 1;
  //   }
  // }
  return res;
};
let candidates = [4, 2, 7, 5, 6],
  target = 16;

timeL(combinationSum, [candidates, target]);
